#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//1.堆内存程序员手动申请,手动释放。
int* getSpace()
{
        int *p = malloc(sizeof(int)*5);
        if(NULL == p){
                return NULL;
        }

        //只要是连续的内存空间,都能使用下标的方式访问内存
        for (int i = 0; i < 5; ++i){
                p[i] = 100 + i;
        }
        return p;
}
void test01()
{
        int *ret = getSpace();
        for (int i = 0; i < 5; ++i){
                printf("%d ",ret[i]);
        }
        //用完堆内存,一定要释放
        free(ret);
        ret  = NULL;
}

//2.
//定义变量的时候一定要初始化,很多的bug产生都是由于没有初始化造成的
void allocateSpace(char *p)
{
        p = malloc(100);
        //memset(p,0,sizeof(p));此时不能使用sizeof
        memset(p,0,100);
        strcpy(p,"hello world!");
}
void test02()
{
        char* p = NULL;//allocateSpace的p和test02的p没有任何关系
        allocateSpace(p);//这个方法不会改变p 要想改变搞成二级指针
        printf("p = %s\n",p); //p = (null)
}
void allocateSpace02(char** p)
{
        char* tmp = malloc(100);
        memset(tmp,0,100);
        strcpy(tmp,"hello world!");

        *p = tmp;
}
void test03()
{
        char* p = NULL;
        allocateSpace02(&p);
        printf("p = %s\n",p);//p = hello world!
}
int main(int argc, char const *argv[])
{
        //test01();
        //test02();
        test03();
        return 0;
}
